/**
 * Copyright (c) 2009 blurredVision
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
 * associated documentation files (the "Software"), to deal in the Software without restriction, 
 * including without limitation the rights to use, copy, modify, merge, publish, distribute, 
 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is 
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all copies or 
 * substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT 
 * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT 
 * OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
#include "StdAfx.h"
#include "IInputHandler.h"
#include "dx/InputHandler.h"
#include "IRenderer.h"

static bool				   g_bChars[255];
static IInputHandler      *g_pInputHandler = NULL;

IInputHandler* coreGetInputHandler()
{
	return g_pInputHandler;
}

bool coreInitInput(int inputhandler) 
{
	// Get the window handle
	HWND hWnd = coreGetMainWindow()->getHWnd();
	// Get the instance handle
	HINSTANCE hInst = coreGetMainWindow()->getHInstance();

	if (coreGetRendererType() == CORE_DIRECTX) {
		g_pInputHandler = new directx::InputHandler();
	}
	 
	// Initialize DirectInput
	if ( !g_pInputHandler->init( hInst, hWnd, inputhandler ) )
	{
		coreGetLog()->WriteError("Initialization of DirectInput failed. Programm will exit.", __FILE__, __LINE__);
		return false;
	}
	coreGetLog()->WriteLog("InputHandler successfully created.", __FILE__, __LINE__);

	memset(g_bChars,0,sizeof(g_bChars));
	
	return true;
}

IInputHandler::IInputHandler(void)
:	bKeyboardInitialized(false), 
	bMouseInitialized(false),
	bJoystickInitialized(false),
	vMouseAbsPos(math::Vector3(0,0,0))
{
}

IInputHandler::~IInputHandler(void)
{
}

void IInputHandler::Destroy()
{
	DELETE_POINTER( g_pInputHandler );
}

const bool IInputHandler::isKeyboardInitialized() const 
{ 
	return bKeyboardInitialized; 
}

const bool IInputHandler::isMouseInitialized() const 
{ 
	return bMouseInitialized; 
}

const bool IInputHandler::isJoystickInitialized() const 
{ 
	return bJoystickInitialized; 
}

const math::Vector3& IInputHandler::getAbsMousePos() const
{
	return vMouseAbsPos;
}

const math::Vector3& IInputHandler::getAbsJoystickPos() const
{
	return vJoystickAbsPos;
}